#ifndef DATA_DECODING
#define DATA_DECODING


#include"../Global.h"
#include "../DataCollect/DataCollect.h"
#include"../CommonUtils/ThreadPool/HzThreadPool.h"
#include"../Client/RecFrameServer.h"
#include<queue>
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
}
class DataDecoding{
public:
    DataDecoding();
    DataDecoding(enum AVCodecID id,RecFrameServer* ecvFrameServer);
    ~DataDecoding();
public:
    /// @brief  初始化解码器
    /// @return
    int init_decode_core();

    /// @brief 释放资源
    /// @return
    int release_decode_core();
 public:

    /// @brief 主运行程序
    /// @return
    int run();

    /// @brief 这是在另一个线程，开始解码
    /// @param thiz
    void start_decode();

    /// @brief 发送一个pkt到上下文   flush = true：结束标志
    /// @param flush
    /// @return
    int send_a_pkt(bool flush);

    /// @brief    从上下文获取解码后的码流
    /// @return   0：成功获取   -1 读取发生错误   else：码流不可用或已结束
    int recv_the_frame();


private:
    bool useHw;
    enum AVHWDeviceType type;//硬件类型
    AVBufferRef *hw_device_ctx;//hw shangxiawen
    enum AVCodecID id;      //编码器ID
    string codec_name;            // 解码器名称
    const AVCodec *codec;         // 解码器描述结构体
    AVCodecParserContext *parser; // 解析器
    AVCodecContext *codecContext; // 上下文
    AVFrame *frame;               // 帧存储
    AVFrame *sw_frame;               // 帧存储  在cup上
    AVFrame *tem_frame;           //tem
    AVPacket *pkt;                // 码流
    std::mutex readContextMutex;             //读写锁
    HzThreadPool* pool;   //
    RecFrameServer* ecvFrameServer;
};


#endif

